home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / ms_dos / e / e.c next >
Text File  |  1993-11-30  |  7KB  |  301 lines

  1. /*======================================
  2.  *  LCON用 EXPファイル実行ドライバ
  3.  *
  4.  *                     1993 by マシーンM
  5.  *======================================
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <process.h>
  12. #include <dos.h>
  13. #include <sys\stat.h>
  14.  
  15. #define VERSION "0.04"
  16.  
  17. #define ENV_EXP "PATHEXP"    //  EXPファイル格納位置  環境変数  
  18. #define EXT_EXP "exp"        //  EXPファイルの拡張子
  19.  
  20. int flag_initt = 0;    //  実行後テキスト画面      0:初期化しない  1:初期化する
  21. int flag_initg = 0;    //  実行後グラフィック画面  0:初期化しない  1:初期化する
  22. int flag_nocrt = 0;    //  nocrtresetフラグ        0:付けない      1:付ける
  23. int flag_exec  = 1;    //  実行フラグ              0:実行しない    1:実行する
  24. int flag_text  = 1;    //  テキスト表示フラグ      0:表示しない    1:表示する
  25.  
  26.  
  27. void
  28. call_int91(int ax)
  29. {
  30.     union REGS inregs, outregs;
  31.  
  32.     inregs.x.ax = ax;
  33.     int86(0x91, &inregs, &outregs);
  34. }
  35.  
  36.  
  37. /*----------------------------------------------------
  38.  * ファイルが存在するかの確認
  39.  *----------------------------------------------------
  40.  * in  name  - ファイル名
  41.  * out <ret> - 1:存在する
  42.  *             0:存在しない
  43.  *----------------------------------------------------
  44.  */
  45. int
  46. is_exist(char *name)
  47. {
  48.     struct stat buf;
  49.  
  50.     return stat(name, &buf) ? 0 : 1;
  51. }
  52.  
  53.  
  54. /*----------------------------------------------------
  55.  * 環境変数に設定されているパスを順番に取り出す
  56.  * (初期化)
  57.  *----------------------------------------------------
  58.  * in  env - 取り出す環境変数名
  59.  *----------------------------------------------------
  60.  */
  61. char path_buf[256];
  62. char *path_ptr;
  63.  
  64. void
  65. init_path(char *env)
  66. {
  67.     char *p;
  68.  
  69.     p = getenv(env);
  70.     if ( p == (char*)0 ) {
  71.         path_buf[0] = 0;
  72.     } else {
  73.         strcpy(path_buf, p);
  74.     }
  75.     path_ptr = strtok(path_buf, ";");
  76. }
  77.  
  78.  
  79. /*----------------------------------------------------
  80.  * 環境変数に設定されているパスを順番に取り出す
  81.  * パスの最後は必ず "\" になっている
  82.  *----------------------------------------------------
  83.  * out <ret> - !0:パス名
  84.  *              0:おわり
  85.  *----------------------------------------------------
  86.  */
  87. char *
  88. get_path(void)
  89. {
  90.     static char buf[256];
  91.     int c;
  92.  
  93.     if ( path_ptr == 0 ) return 0;
  94.  
  95.     strcpy(buf, path_ptr);
  96.     c = strlen(buf);
  97.     if ( c > 0  &&  buf[c-1]!='\\'  &&  buf[c-1]!=':' ) {
  98.         strcat(buf, "\\");
  99.     }
  100.     path_ptr = strtok(NULL, ";");
  101.  
  102.     return buf;
  103. }
  104.  
  105.  
  106. /*-------------------------------------------------
  107.  * 指定ファイル名の拡張子を再設定する
  108.  *-------------------------------------------------
  109.  * in  name - ファイル名
  110.  *     ext  - 拡張子(ピリオドはいらない)
  111.  *            例. "EXP"
  112.  *-------------------------------------------------
  113.  */
  114. void
  115. extcat(char *name, char *ext)
  116. {
  117.     char *pp, *nmp;
  118.  
  119.     if ( (nmp=strrchr(name, '\\'))==NULL ) {    //  ファイル名の位置設定
  120.         nmp = name;
  121.     }
  122.  
  123.     if ( (pp=strrchr(nmp, '.'))!=NULL ) {        //  ファイル名の"."以降を削除
  124.         *pp = 0;
  125.     }
  126.     strcat(name, ".");
  127.     strcat(name, ext);
  128. }
  129.  
  130.  
  131. /*-------------------------------------------
  132.  * ファイルを検索し、フルパスを返す
  133.  *-------------------------------------------
  134.  */
  135. char *
  136. search_exp(char *name)
  137. {
  138.     static char buf[256];
  139.     char *path;
  140.  
  141.     if ( strchr(name, '\\')!=NULL || strchr(name, ':')!=NULL ) {
  142.         strcpy(buf, name);
  143.         extcat(buf, EXT_EXP);
  144.         if ( is_exist(buf) ) return buf;
  145.  
  146.     } else {
  147.         init_path(ENV_EXP);
  148.         while ( (path=get_path()) != 0 ) {
  149.             strcpy(buf, path);
  150.             strcat(buf, name);
  151.             extcat(buf, EXT_EXP);
  152.             if ( is_exist(buf) ) return buf;
  153.         }
  154.     }
  155.     return (char*)0;
  156. }
  157.  
  158.  
  159.  
  160. int
  161. option_check(int argc, char *argv[])
  162. {
  163.     int j;
  164.  
  165.     if ( argc < 2 ) return 1;
  166.     if ( argv[1][0] != '-' ) return 0;
  167.  
  168.     for (j=1; argv[1][j]!=0; ++j) {
  169.         switch ( toupper(argv[1][j]) ) {
  170.         case 'G': flag_initg = 1; break;
  171.         case 'I': flag_initt = 1; break;
  172.         case 'N': flag_nocrt = 1; break;
  173.         case 'P': flag_exec  = 0; break;
  174.         case 'S': flag_text  = 0; break;
  175.         default : return 1;
  176.         }
  177.     }
  178.     return 0;
  179. }
  180.  
  181.  
  182. /*-------------------------------------------
  183.  * ファイル名を取得する
  184.  *-------------------------------------------
  185.  */
  186. char *
  187. get_name(int argc, char *argv[])
  188. {
  189.     static char buf[256];
  190.     int n;
  191.  
  192.     n = (argv[1][0]=='-') ? 2 : 1;
  193.     if ( n >= argc ) return (char *)0;
  194.  
  195.     strcpy(buf, argv[n]);
  196.  
  197.     return buf;
  198. }
  199.  
  200.  
  201. /*-------------------------------------------
  202.  * ファイル名以降の文字を取得する
  203.  *-------------------------------------------
  204.  */
  205. char *
  206. get_arg(int argc, char *argv[])
  207. {
  208.     static char buf[256];
  209.     int n, i;
  210.  
  211.     n = (argv[1][0]=='-') ? 3 : 2;
  212.  
  213.     buf[0] = 0;
  214.     for (i=n; i<argc; ++i) {
  215.         strcat(buf, " ");
  216.         strcat(buf, argv[i]);
  217.     }
  218.     return buf;
  219. }
  220.  
  221.  
  222.  
  223. char *usage_strings[]={
  224.     "===== EXPファイル実行ドライバ(LCON専用) version "VERSION" ====="  ,
  225.     "                      Copyright (c) 1993 マシーンM"             ,
  226.     " Usage: e [-{<option>}] <EXPファイル名> [{<引数>}]"         ,
  227.     "  <option>: g - 実行後、グラフィック画面を消去する"         ,
  228.     "            i - 実行後、テキスト画面を初期化する"           ,
  229.     "            n - 「-nocrt」 を付ける"                          ,
  230.     "            p - 実行コマンド文字列を表示する(実行はしない)" ,
  231.     "            s - 実行時、テキスト表示を禁止する"             ,
  232.     0
  233. };
  234.  
  235. void
  236. show_strings(char *strings[])
  237. {
  238.     int i;
  239.  
  240.     for (i=0; strings[i]!=0; ++i) {
  241.         puts(strings[i]);
  242.     }
  243. }
  244.  
  245. void
  246. print_usage(void)
  247. {
  248.     show_strings(usage_strings);
  249.     exit(1);
  250. }
  251.  
  252.  
  253. int
  254. main(int argc, char *argv[])
  255. {
  256.     char *name;
  257.     char *pathname;
  258.     char *arg;
  259.     static char buf[256];
  260.     int ret = 0;
  261.  
  262.     if ( option_check(argc, argv) == 1 ) print_usage();
  263.  
  264.     name = get_name(argc, argv);
  265.     arg  = get_arg(argc, argv);
  266.     if ( name ) {
  267.         strcpy(buf, "run386 ");
  268.         if ( flag_nocrt ) strcat(buf, "-nocrt ");
  269.         pathname = search_exp(name);
  270.         if ( pathname ) {
  271.             strcat(buf, pathname);
  272.             if ( arg ) strcat(buf, arg);
  273.             if ( flag_exec ) {
  274.                 if ( !flag_text ) {
  275.                     call_int91(0x3004);        // TEXT OFF
  276.                     outportb(0xfda0, 0x0f);    // レイア1 ON
  277.                 }
  278.                 call_int91(0x3001);            // 現在の TEXT VRAM を退避
  279.                 call_int91(0x3010);            // TEXT VRAM1 を選択
  280.                 ret = system(buf) ? 1 : 0;
  281.                 call_int91(0x3002);            // 以前の TEXT VRAM を復帰
  282.             } else {
  283.                 puts(buf);
  284.             }
  285.         } else {
  286.             strcpy(buf, "not found : ");
  287.             strcat(buf, name);
  288.             puts(buf);
  289.             ret = 1;
  290.         }
  291.     }
  292.     if ( flag_initt ) {
  293.         call_int91(0x3080);    // コンソール初期化
  294.         call_int91(0x3003);    // 文字描画開始
  295.     }
  296.     if ( flag_initg ) {
  297.         putchar('\x15');    // グラフィック消去
  298.     }
  299.     return ret;
  300. }
  301.